<?php
// +----------------------------------------------------------------------
// |          管 理 A P I 文 件         2020-05-07 08:00:00
// +----------------------------------------------------------------------
// |     Auth:绳俊辉        E-mail:mail@owap.cn      QQ:1807931872
// +----------------------------------------------------------------------

namespace app\api\controller;

use think\Db;

use think\Config;

class Admin
{
    /*
    *   管理端初始化
    *   @desc 管理端启动的时候会调用此函数
    *   @return 返回应用信息
    */ 
    public function index($key=null,$version=null)
    {
        #return json(Config('info.software')['version']);exit;
        if(!$key){return api_go(-1,'缺少参数!');}
        if($key!=Config('info.key')){return api_go(-1,'数据异常,初始化失败!');}
        $info = Config('info.adminsoft');
        if(in_array($version,$info['version']))
        {
            $data = [
                'up_http'=>$info['uphttp'],
                'up_msg'=>$info['upmsg'],
                'version'=>$info['version'][0],
                'up_type'=>$info['uptype']
            
            ];
            return api_go(0,'',$data);
        }else{
            return api_go(-1,'当前版本不受支持,请及时更新!');
        }
    }

    /*
    *   读取对应信息列表,包括对应人和对应组
    *   @desc 需要传入用户名、token
    *   @return 返回数据库中的所有对应数据
    */ 
    public function loadfishc($user=null,$token=null,$list=null)//读取对应信息
    {
        if(!$user||!$token||!$list){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
        if($list==1)//群组
        {
            $info = Db::name('namebase')
            ->column('group','zc_name');
            if($info)
            {
                return api_go(0,'读取成功!',$info);
            }
            return api_go(0,'读取失败!',$info);
        }else{//对应人
            $info = Db::name('namebase')
            ->column('name','zc_name');
            if($info)
            {
                return api_go(0,'读取成功!',$info);
            }
            return api_go(0,'读取失败!',$info);
        }
    }

    /*
    *   管理登录
    *   @desc 需要账号密码以及key完成登录操作
    *   @return 返回管理身份信息
    */ 
    public function login($user=null,$pass=null,$key=null)//登录
    {
        if(!$user||!$pass||!$key){return api_go(-1,'缺少参数!');}
        $info = Db::name('software')
        ->where('key',$key)
        ->find();
        if($info){
            $info = Db::name('admin')
            ->where('username',$user)
            ->find();
            if(!$info){api_log('管理登录','登录失败!未经授权的账号!',$user,$user);return api_go(-1,'账号不存在!');}
            if($info['password']!=$pass){api_log('管理登录','登录失败!密码输入错误!',$user,$user);return api_go(-1,'账号或密码错误!');}
            if($info['sate']!=1){api_log('管理登录','登录失败!被封禁的账号尝试登录!',$user,$user);return api_go(-1,'账号已被封禁!');}
            $ip = get_client_ip();
            $city = get_ip_city($ip);
            $token = GoToken(36);
            $data = [
                'name'=>$info['name'],
                'group'=>$info['group'],
                'ip'=>$ip,
                'city'=>$city,
                'token'=>$token
            ];
            $updata = [
                'logip'=>$ip,
                'logtime'=>time(),
                'logcity'=>$city,
                'token'=>$token,
                'token_end'=>time()+310
            ];
            Db::name('admin')
            ->where('username',$user)
            ->update($updata);
            api_log('管理登录','登录成功!',$user,$user);
            return api_go(0,'登录成功!',$data);
        }else{
            api_log('管理登录','登录失败!数据异常! [安全警报触发0x21]',$user,$user);
            return api_go(-1,'某些数据存在异常?!');
        }
    }

    /*
    *   管理注册
    *   @desc 一般情况下这个接口是关闭的,为了防止恶意人士的使用
    *   @return 返回注册状态
    */ 
    public function reg($user=null,$pass=null,$name=null,$group=null)
    {
        return api_go(-1,'入口已关闭');
        if(!$user||!$pass||!$name||!$group)
        {
            return api_go(-1,'缺少参数!');
        }
        $info = Db::name('admin')
        ->where('username',$user)
        ->find();
        if($info){return api_go(-1,'已存在!');}
        $ip = get_client_ip();
        $data = [
            'username'=>$user,
            'password'=>$pass,
            'name'=>$name,
            'group'=>$group,
            'sate'=>0,
            'regtime'=>time(),
            'regip'=>$ip
        ];
        $info = Db::name('admin')
        ->insert($data);
        if($info)
        {
            return api_go(0,'注册成功!');
        }else{
            return api_go(-1,'注册失败!');
        }
    }

    /*
    *   退出在线
    *   @desc 需要用户名和token完成下线操作
    *   @return 返回下线状态
    */
    public function logout($user=null,$token=null)//退出登录
    {
        if(!$user||!$token){return api_go(-1,'缺少参数!');}
        $info = Db::name('admin')
        ->where('username',$user)
        ->find();
        if($token!=$info['token']){return api_go(-1,'身份校对失败!');}
        $data = [
            'token'=>null,
            'token_end'=>0
        ];
        $info = Db::name('admin')
        ->where('username',$user)
        ->update($data);
        if($info){
            return api_go(0,'退出成功!');
        }else{
            return api_go(-1,'退出失败!');
        }
    }

    /*
    *   保持在线
    *   @desc 对传入的信息进行判断,如果有效则延长状态
    *   @return 返回心跳状态
    */
    public function heart($user=null,$token=null)//心跳 保持在线
    {
        if(!$user||!$token){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
        
        $info = Db::name('admin')
        ->where('username',$user)
        ->update(['token_end'=>time()+310]);
        if($info){
            return api_go(0,'心跳成功!');
        }else{
            return api_go(-1,'心跳失败!');
        }

    }

    /*
    *   读取用户列表
    *   @desc 查询数据库中所有用户的信息(经过field筛选后)
    *   @return 返回用户列表信息
    */
    public function loaduser($user=null,$token=null)//读取用户列表
    {
        if(!$user||!$token){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
       
        
        $field = ['password','machine','regip','regtime','logip','token'];
        $info = Db::name('user')
        ->field($field,true)
        ->select();
        if(!$info){return api_go(-1,'数据异常!');}
        return api_go(0,'读取完毕!',$info);
    }

    /*
    *   读取对应信息列表,包括对应人和对应组
    *   @desc 需要传入用户名、token
    *   @return 返回数据库中的所有对应数据
    */ 
    public function loadnamebase($user=null,$token=null)//读取对应人列表
    {
        if(!$user||!$token){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
       
        $info = Db::name('namebase')
        ->select();
        if(!$info){return api_go(-1,'数据异常!');}
        return api_go(0,'读取完毕!',$info);
    }

    /*
    *   读取平台接口列表
    *   @desc 需要用户名和token
    *   @return 返回平台接口信息
    */
    public function loadzcid($user=null,$token=null)//读取平台接口列表
    {
        if(!$user||!$token){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
       
        $info = Db::name('zcid')
        ->select();
        if(!$info){return api_go(-1,'数据异常!');}
        return api_go(0,'读取完毕!',$info);
    }

    /*
    *   读取日志
    *   @desc 读取系统运行日志
    *   @return 返回日志列表
    */
    public function loadlog($user=null,$token=null)//读取日志
    {
        if(!$user||!$token){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
       
        $info = Db::name('log')
        ->select();
        if(!$info){return api_go(-1,'数据异常!');}
        return api_go(0,'读取完毕!',$info);
    }

    /*
    *   读取用户的详细信息
    *   @desc 需要用户ID
    *   @return 返回该用户所有数据
    */
    public function loaduserinfo($user=null,$token=null,$id=null)//读取用户详细信息
    {
        if(!$user||!$token||!$id){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}

        $info = Db::name('user')
        ->where('id',$id)
        ->find();
        if(!$info){return api_go(-1,'读取失败!用户不存在');}
        return api_go(0,'读取成功!',$info);
    }

    /*
    *   修改用户信息
    *   @desc 需要好多好多参数...
    *   @return 返回执行状态
    */
    public function upuserinfo($user=null,$token=null,$up_id=null,$up_pass=null,$up_name=null,$up_group=null,$up_sate=null,$up_token=null)//更新用户信息
    {
        if(!$user||!$token||!$up_pass||!$up_id||!$up_name||!$up_group){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
        $data = [
            'password'=>$up_pass,
            'name'=>$up_name,
            'group'=>$up_group,
            'sate'=>intval($up_sate),
            'token'=>$up_token
        ];
        $info = Db::name('user')
        ->where('id',$up_id)
        ->update($data);
        $userinfo = Db::name('user')
        ->where('id',$up_id)
        ->find();
        if($info){
            api_log('管理-更新用户','修改了用户的信息',Name_admin($user),$userinfo['name']);
            return api_go(0,'修改成功!');
        }else{
            return api_go(-1,'修改失败!');
        }
        
    }

    /*
    *   用户强制下线
    *   @desc 
    *   @return 
    */
    public function downuser($user=null,$token=null,$id=null)//下线用户
    {
        if(!$user||!$token||!$id){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
        $data = [
            'logtime'=>0,
            'logip'=>null,
            'logcity'=>null,
            'token'=>null,
            'token_end'=>0
        ];
        $info = Db::name('user')
        ->where('id',$id)
        ->update($data);
        $userinfo = Db::name('user')
        ->where('id',$id)
        ->find();
        if($info){
            api_log('管理-下线操作','强制下线了用户',Name_admin($user),$userinfo['name']);
            return api_go(0,'下线成功!');
        }else{
            return api_go(-1,'下线失败!');
        }
    }

    /*
    *   更新平台接口信息
    *   @desc 需要对应的ID、欲修改平台ID、平台title
    *   @return 返回执行状态
    */
    public function upzcid($user=null,$token=null,$id=null,$zcid=null,$title=null)//更新接口信息
    {
        if(!$user||!$token||!$id||!$zcid||!$title){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
        $data = [
            'zcid'=>$zcid,
            'title'=>$title,
            'add_time'=>time(),
            'add_admin'=>Name_admin($user)
        ];
        $info = Db::name('zcid')
        ->where('id',$id)
        ->update($data);
        if($info){
            api_log('管理-接口更新','更新接口信息,其ID为:'.$id, Name_admin($user),$userinfo['username']);
            return api_go(0,'修改成功!');
        }else{
            return api_go(-1,'修改失败!');
        }
    }

    /*
    *   更新对应人信息
    *   @desc 需要相应的ID和欲修改的参数
    *   @return 返回执行状态
    */
    public function upnamebase($user=null,$token=null,$id=null,$zc_name=null,$name=null,$group=null,$listid=null)//更新对应人信息
    {
        if(!$user||!$token||!$id||!$zc_name||!$listid){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
        #$list_data = Db::name('zcid')->select();
        $info = Db::name('namebase')
        ->where('zc_name',$zc_name)
        ->select();
        #dump($info);
        for ($i=0; $i < count($info); $i++) { 
            if ($info[$i]['listid']==$listid) {
                return api_go(-1,'对应人已存在!其ID为:'.$info[$i]['id']);
            }
        }
        $data = [
            'zc_name'=>$zc_name,
            'name'=>$name,
            'group'=>$group,
            'listid'=>intval($listid)
        ];
        $info = Db::name('namebase')
        ->where('id',$id)
        ->update($data);
        api_log('管理-对应信息修改','更新对应信息,其ID为:'.$id, Name_admin($user),'');
        if($info){
            return api_go(0,'修改成功!');
        }else{
            return api_go(-1,'修改失败!');
        }
    }
    
    /*
    *   添加用户
    *   @desc 不需要ID,但需要用户名、md5(md5(密码))、姓名、组、状态
    *   @return 返回执行状态
    */
    public function adduser($user=null,$token=null,$up_user=null,$up_pass=null,$up_name=null,$up_group=null,$up_sate=null)//添加用户
    {
        if(!$user||!$token||!$up_user||!$up_pass||!$up_name||!$up_group||!$up_sate){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
        $info = Db::name('user')
        ->where('username',$up_user)
        ->find();
        if($info){return api_go(-1,'用户已存在其ID为:'.$info['id']);}
        $ip = get_client_ip();
        $data = [
            'username'=>$up_user,
            'password'=>$up_pass,
            'name'=>$up_name,
            'group'=>$up_group,
            'sate'=>intval($up_sate),
            'regip'=>$ip,
            'regtime'=>time()
        ];
        $info = Db::name('user')
        ->insert($data);
        if($info){
            api_log('管理-添加用户','用户添加成功,QQ:'.$up_user.'姓名:'.$up_name, Name_admin($user),$up_user);
            return api_go(0,'添加成功!');
        }else{
            return api_go(-1,'添加失败!');
        }

    }

    /*
    *   添加平台接口
    *   @desc 需要接口ID和title
    *   @return 返回执行状态
    */
    public function addzcid($user=null,$token=null,$zcid=null,$title=null)//添加平台接口
    {
        if(!$user||!$token||!$zcid||!$title){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
        $info = Db::name('zcid')
        ->where('zcid',$zcid)
        ->find();
        if($info){return api_go(-1,'接口已存在!其ID为:'.$info['id']);}
        $data = [
            'zcid'=>$zcid,
            'title'=>$title,
            'add_time'=>time(),
            'add_admin'=>Name_admin($user)
        ];
        $info = Db::name('zcid')
        ->insert($data);
        if($info){
            api_log('管理-添加接口','接口添加成功,ID:'.$zcid.'标题:'.$title, Name_admin($user),'');
            return api_go(0,'添加成功!');
        }else{
            return api_go(-1,'添加失败!');
        }
    }

    /*
    *   添加对应人
    *   @desc 需要平台昵称、姓名、组
    *   @return 返回执行状态
    */
    public function addnamebase($user=null,$token=null,$zc_name=null,$name=null,$group=null,$listid=null)//添加对应人
    {
        if(!$user||!$token||!$zc_name||!$name||!$group||!$listid){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
        $info = Db::name('namebase')
        ->where('zc_name',$zc_name)
        ->select();
        #dump($info);
        for ($i=0; $i < count($info); $i++) { 
            if ($info[$i]['listid']==$listid) {
                return api_go(-1,'对应人已存在!其ID为:'.$info[$i]['id']);
            }
        }
        $data = [
            'zc_name'=>$zc_name,
            'name'=>$name,
            'group'=>$group,
            'add_time'=>time(),
            'listid'=>intval($listid)
        ];
        $info = Db::name('namebase')
        ->insert($data);
        if($info){
            api_log('管理-添加对应信息','对应信息添加成功,平台昵称:'.$zc_name.'使用人:'.$name.'所属组:'.$group, Name_admin($user),'');
            return api_go(0,'添加成功!');
        }else{
            return api_go(-1,'添加失败!');
        }
    }

    /*
    *   删除用户
    *   @desc 需要用户ID
    *   @return 返回执行状态
    */
    public function deluser($user=null,$token=null,$id=null)//删除用户
    {
        if(!$user||!$token||!$id){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
        return api_go(-1,'为了保障数据安全,此接口已停止使用!');
        $userinfo = Db::name('user')
        ->where('id',$id)
        ->find();
        $info = Db::name('user')
        ->where('id',$id)
        ->delete();
        if($info){
            api_log('管理-删除用户','用户删除成功,QQ:'.$userinfo['username'].'姓名:'.$userinfo['name'].'所属组:'.$userinfo['group'], Name_admin($user),'');
            return api_go(0,'删除成功!');
        }else{
            return api_go(-1,'删除失败!');
        }
    }

    /*
    *   删除平台接口
    *   @desc 需要ID
    *   @return 返回执行状态
    */
    public function delzcid($user=null,$token=null,$id=null)//删除平台接口
    {
        if(!$user||!$token||!$id){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
        $idinfo = Db::name('zcid')
        ->where('id',$id)
        ->find();
        $info = Db::name('zcid')
        ->where('id',$id)
        ->delete();
        if($info){
            api_log('管理-删除平台接口','平台接口删除成功,ID:'.$idinfo['zcid'].'标题:'.$idinfo['title'], Name_admin($user),'');
            return api_go(0,'删除成功!');
        }else{
            return api_go(-1,'删除失败!');
        }
    }

    /*
    *   删除对应人
    *   @desc 需要传入对应的ID,按照对应的ID删除信息
    *   @return 返回执行状态
    */
    public function delnamebase($user=null,$token=null,$id=null)//删除对应人
    {
        if(!$user||!$token||!$id){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}
        $namebaseinfo = Db::name('namebase')
        ->where('id',$id)
        ->find();
        $info = Db::name('namebase')
        ->where('id',$id)
        ->delete();
        if($info){
            api_log('管理-删除对应信息','对应信息删除成功,ID:'.$id.'平台昵称:'.$namebaseinfo['zc_name'].'使用人:'.$namebaseinfo['name'].'所属组:'.$namebaseinfo['group'], Name_admin($user),'');
            return api_go(0,'删除成功!');
        }else{
            return api_go(-1,'删除失败!');
        }
    }

    /*
    *   下线所有用户
    *   @desc 需要额外的安全密码
    *   @return 返回执行状态
    */
    public function downall($user=null,$token=null)
    {
        if(!$user||!$token){return api_go(-1,'缺少参数!');}
        $code = Sate_admin($user,$token);
        if($code==-1){return api_go(-1,'数据异常!');}
        if($code==-2){return api_go(-1,'账户被封禁!');}
        if($code==-3){return api_go(-1,'身份过期,请重新登录!');}

        $info = Db::name('user')
        ->where('token_end','<>',0)
        ->update(['token'=>null,'token_end'=>0]);
        if($info){
            api_log('管理-全体下线','操作成功!', Name_admin($user),'');
            return api_go(0,'操作成功!');
        }else{
            api_log('管理-全体下线','操作失败!', Name_admin($user),'');
            return api_go(-1,'操作失败!原因:你近期可能已执行过此操作!');
        }
    }
}
